Von Maur, Inc 是一家历史悠久的卖场,成立于19世纪,总部位于美国。作为一家知名的零售商,Von Maur 主要经营高端时装、家居用品和美妆产品。 Von Maur EDI 需求分析EDI 是一种无纸化的电子数据传输方式,零售商和供应商使用 EDI 进行数据传输,能够提高传输效率以及准确性,通过减少多余的数据传输来降低成本。 与 Von Maur 之间的合作,供应商需要具备 EDI 能力。可以联系 Von Maur 的 EDI 团队,从而开始设置和测试流程。 Von Maur 将会给供应商提供 EDI 规范以及连接信息等资料,同时也将提供测试以及实施计划表。EDI 负责人会根据与供应商之间的 EDI 测试情况来决定是否可以正式使用 EDI 传输业务数据。 扩展阅读: 下载 Von Maur 提供的 EDI 相关资料与 Von Maur 之间进行 EDI 测试的注意事项Von Maur 要求所有交易伙伴必须能够接收 850 采购订单或发送 855(供应商生成
inc ebx N 0: 4e dec esi O 0: 4f dec edi edi 1: 61 popa Ge 0: 47 inc edi 1: 65 : 47 inc edi 1: 64 fs Tb 0: 54 inc ebx 1: 6d ins DWORD PTR es:[edi],dx Bk 0: 42 DWORD PTR [ecx],edi shellcode += b"Ag"*1 #inc ecx;addr16; shellcode += b"F"*0x46 #inc esi; shellcode
.386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib
include irvine32.inc; .data i dword 0; sum qword 0; str1 byte “请输入16进制的(32位整数)乘数和被乘数”,0 str2 byte “乘积为 ,0;edi为(高32位)乘积值; mov cl,0;cl为移位的位数 call readhex; cmp eax,80000000h; jna L4; neg eax; inc j; L4: mov ebx,eax; ebx存储乘数(来移位的) ;call writeint; call readhex; cmp eax,80000000h ; jna L5; neg eax; inc j; L5: mov i,eax; ;call writeint; mov eax,0; cmp ebx, 0; ,1; L3: add edi,esi; next: inc cl; jmp L2; quit: call crlf; mov edx,offset
.386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc include msvcrt.inc 则说明计算完毕跳转到nops ror edx,7 ; 不为零,则进行循环右移7位 add edx,eax ; 将循环右移的值不断累加 inc ,edi ; 用edi寄存器作为索引 ; ------- 循环读取导出表函数 next_loop: inc edi ,edi // 清空edi中的内容,用作索引 // ===循环读取导出表函数 next_function_loop: inc edi
, char *argv[]) { printf("inc1: %d\n", inc1(1)); printf("inc2: %d\n", inc2(1)); } 该例子中的inc方法都是将src /a.out inc1: 1 inc2: 2 由上可以看到,inc1的结果是1,这是因为编译器认为src只是asm语句的输入,所以它不会被修改,所以在return的时候直接返回了原值。 看下其对应的汇编代码: $ gcc -O3 main.c && objdump --disassemble=inc1 a.out 0000000000001180 <inc1>: 1180: 89 f8 mov %edi,%eax 1182: 83 c7 01 add $0x1,%edi 1185: f8 mov %edi,%eax 1192: 83 c0 01 add $0x1,%eax 1195: c3
.386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib .386p .model flat,stdcall option casemap:none include windows.inc include kernel32.inc includelib
字符串操作指令 移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位 比较串指令: CMPSB、CMPSW、CMPSD ; 比较 ESI、EDI; 执行后, ESI 与 EDI 的地址移动相应的单位 扫描串指令: SCASB、SCASW、SCASD ;依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化 储存串指令: STOSB、STOSW、STOSD ;将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化 载入串指令: LODSB、LODSW、LODSD EDI指向的内存空间中,该指令常用于对特定字符串的复制操作. .386p .model flat,stdcall option casemap:none include windows.inc cmp byte ptr [edi],0 ; 分别那[edi]的值和0作比较 je L2 ; 上一步为零则跳转得到ret inc edi
004124B9 95 xchg eax,ebp 004124BA 4D dec ebp 004124BB 42 inc edx ; ntdll.KiFastSystemCallRet 004124BC 40 inc eax pushad 0040F4EE BE 15904000 mov esi,test.00409015 0040F4F3 8DBE EB7FFFFF lea edi ,dword ptr ds:[esi-0x8015] 0040F4F9 57 push edi 0040F4FA 83CD FF or ebp,-0x1 esi 0040F508 8807 mov byte ptr ds:[edi],al 0040F50A 47 inc edi 0040F50B
01014258 > /8A06 MOV AL,BYTE PTR DS:[ESI] ; // 0101425A . |46 INC ESI 0101425B . |8807 MOV BYTE PTR DS:[EDI],AL 0101425D . |47 INC EDI 0101425E ] ; / 0101431C . |47 INC EDI 0101431D . |2C E8 SUB AL,0E8 MOV EAX,DWORD PTR DS:[EDI] ; edi = upx import table?? ] 0101436B . 47 INC EDI 0101436C . 08C0 OR AL,AL 0101436E .^ 74 DC
mov %rsp,%rbp 400531: 89 7d fc mov %edi,-0x4(%rbp) 400534: 8b 45 fc 第三句,把edi存到栈上。在x64处理器上,前6个参数都是使用寄存器传参的。第一个参数会使用rdi,第二个参数使用 rsi,等等。 所以 edi 里存的其实就是第一个参数,也就是整数 3,为什么使用rdi的低32位,也就是 edi 呢?因为我们的入参 a 是 int 型啊。大家可以换成 long 型看看效果。 // push rbp 0x48, 0x89, 0xe5, // mov rsp, rbp 0x89, 0xf8, // mov edi 进一步优化成这样: char code[] = { 0x89, 0xf8, // mov edi, eax 0x83, 0xc0, 0x01, //
ebp, esi mov dword ptr [esp+0x18], ecx inc al cmp dword ptr [edi+0x100], -1 +ebx*4], ecx mov dword ptr [edi+eax*4], edx add edx, ecx inc al and edx mov dword ptr [edi+eax*4], edx add edx, ecx inc al and edx, 0x0FF ptr [edi+eax*4], edx add edx, ecx inc al and edx, 0x0FF ror ebp, 8 , ecx inc al and edx, 0x0FF mov edx, dword ptr [edi+edx*4] xor dl, byte
移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位 比较串指令: CMPSB、CMPSW、CMPSD ;比较 ESI、EDI ; 执行后, ESI 与 EDI 的地址移动相应的单位 扫描串指令: SCASB、SCASW、SCASD ;依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化 储存串指令 : STOSB、STOSW、STOSD ;将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化 载入串指令: LODSB、LODSW、LODSD ;将 ESI 指向的数据载入到 ; 分别那[edi]的值和0作比较 je L2 ; 上一步为零则跳转得到ret inc edi ; 否则继续执行 inc 分别拿出每一个字节,与0比较 je L2 ; 如果相等则跳转到L2 and byte ptr [esi],11011111b ; 执行按位与操作 inc
在与沃尔玛Walmart进行EDI对接的第一步,是根据自己的业务类型及所处国家选择所适用的EDI规范,完成EDI mapping(映射)。 关于812的一般性说明请参见文章EDI 812 贷项/借项调整 997确认回执 确认回执997必须在收到812后2-4小时内发出。 20050419*000000000877332*A*1590*C**000000000877332****00*CR CUR*BY*USD N9*IA*234567 PER*CR*WAL-MART STORES INC *TE*4792734089 N1*XI*WAL-MART STORES INC. 812报文的解读,更多沃尔玛Walmart EDI 报文可以参考: 沃尔玛Walmart EDI解决方案之810发票业务 沃尔玛Walmart EDI解决方案之850采购订单业务 注:文案部分图片及内容来源于网络
会首先触发0158漏洞,拷贝0xF00字节栈溢出后,通过覆盖返回地址实现利用 eax=00121700 ebx=0b7a00e0 ecx=7c93003d edx=0ef10020 esi=08ece6bc edi DLLGetDocumentation+0xcf1 0:000> p eax=00000000 ebx=0b7a00e0 ecx=7c93003d edx=00140608 esi=08ece6bc edi ebx 0a0a09d1 43 inc ebx 0a0a09d2 43 inc ebx 0a0a09d3 43 inc ebx 0a0a09d4 43 inc ebx 0a0ffad4 31db xor ebx,ebx 0a0ffad6 cmp dword ptr [edi],0E3E3ACACh 4) 样本中对应的压缩流及TIF如下: ?
BRP Inc.是一家加拿大的多元化制造商和世界领先的动力体育产品制造商,主要生产雪地摩托、全地形车、旋翼飞行器、公路车辆和船艇等各种动力体育产品,其知名品牌包括 Ski-Doo、Lynx、Sea-Doo 作为一个大型的制造商,BRP Inc.使用EDI(电子数据交换)来处理其与供应商、客户和合作伙伴之间的业务交流。 3.准备EDI规范 EDI规范是实施EDI项目的基础,本次BRP EDI项目中,EDI规范的版本号为:4010。企业可以在知行EDI 规范查询平台中,进一步的了解相应规范以及版本号下的字段信息。 通过EDI系统与BRP收发生产数据。 通过以上8个步骤,想必大家已经对EDI项目流程有所了解了。需要注意的一点是:企业的内部业务数据与EDI系统之间如何实现互通? 了解更多 EDI 信息,请参阅: EDI 是什么?
: %d\n", inc1(1)); printf("inc2: %d\n", inc2(1)); printf("inc3: %d\n", inc3(1)); } 上面代码中三个inc方法的意图都是对 /a.out inc1: 2 inc2: 4 inc3: 2 inc2方法居然返回的不是2,而是4,奇怪吧。但为什么呢,让我们反编译看下。 f8 mov %edi,%eax 1192: 83 c0 01 add $0x1,%eax 1195: c3 f8 mov %edi,%eax 11a2: b8 03 00 00 00 mov $0x3,%eax 11a7: 83 : 41 89 f8 mov %edi,%r8d 11b3: b8 03 00 00 00 mov $0x3,%eax 11b8
include kernel32.inc include user32.inc includelib kernel32.lib includelib user32.lib MY_DLG equ :ptr CONTEXT mov esi,[pExcept] mov edi,[pContext] cmp [esi].ExceptionCode,STATUS_SINGLE_STEP jnz @continue ;检查是否为单步异常 inc [edi].regEax ;EAX = EAX + 1 mov ebx,[edi].regEip cmp byte ptr [ebx],90h ;检查下一个字节是否90(NOP) jz @finish ;如果遇到NOP则结束跟踪 or [edi].regFlag,100h ;否则继续对TF位置1 @finish: popad mov eax ;从这里开始“单步跟踪” inc eax inc eax dec eax ;对EAX进行一些操作,如果没有异常EAX=2 nop ;用NOP标志跟踪结束 mov [num],eax
,0x45,0x08, 0x5f, 0x5b, 0x5d, 0xc3 }; 3.汇编代码如下 push ebp mov ebp, esp push ebx push edi mov edi, dword ptr ss:[ebp + 0xC] mov bl, byte ptr ds:[edi] test bl, bl je 0x7E004C edx + eax], cl je 0x7E0026 //重定位 mov al, byte ptr ds:[esi + 0x1] inc esi inc edx test al, al jne 0x7E0020 //重定位 pop esi pop edi xor eax, eax pop ebx pop ebp ret mov eax, esi pop esi pop edi pop
我们先来看看CoInitialize的汇编 769B2A24 mov edi, edi 769B2A26 push ebp 769AEF73 xor edi, edi 769AEF75 cmp [ebp+8], edi ; 推断第一个參数是否为 ebx ; unsigned __int32 769AEFA5 xor esi, esi 769AEFA7 inc 即为单线程套件 769AEFEF 769AEFEFloc_769AEFEF: 769AEFEF add eax, 18h 769AEFF2 inc CODE XREF:CoInitializeEx(x,x)+2C0B6j 769AF03C xor esi, esi 769AF03E inc